/* 
 *请求模块
 */
import axios from 'axios';
import JSONbig from 'json-bigint';
import { Toast } from 'vant';
//在非组件模块获取store,必须通过这种方式
import store from '../store/';
import router from '@/router';
const refreshTokenReq = axios.create({
	baseURL:'http://ttapi.research.itcast.cn/',//基础路径
});
const request = axios.create({
	baseURL:'http://ttapi.research.itcast.cn/',//基础路径
	transformResponse:[function(data){
		//后端返回的数据可能不是JSON格式字符串
		//如果不是的话，那么JSONbig.parse调用就会报错
		//所以我们使用try-catch 来捕获异常，处理异常的发生
		try{
			//如果转换成功，则直接把结果返回
			return JSONbig.parse(data);
		}catch(err){
			console.log('转换失败',err);
			//如果转换失败了，则进入这里
			//我们早这里直接把数据原样返回给请求使用
			return data;
		}
	}]
});

//请求拦截器
request.interceptors.request.use(function(config){
	const {user} = store.state;
	//如果用户已登入，统一给接口设置token信息
	if(user){
		config.headers.Authorization = `Bearer ${store.state.user.token}`;
	}
	return config;
},function(error){
	return Promise.reject(error);
});

//响应拦截器
request.interceptors.response.use(function (response) {
	//响应成功进入
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    return response;
  }, async function (error) {
	  //响应失败进入这里
	  //超过2xx的状态码都会进入这里
	  const status = error.response.status;
	  if(status ===400){
		 Toast.fail('客户端请求参数错误');
	  }else if( status === 401){
		  //token 无效
		  //如果没有user 或者 user.token 直接去登录
		  const {user} = store.state;
		  if(!user || !user.token){
			  //直接跳转到登录页面
			  return redirectLogin();
		  }
		 // 使用refresh_token请求获取新的token
		  try{
			  const { data } = await refreshTokenReq({
				  method:'PUT',
				  url:'/app/v1_0/authorizations',
				  headers:{
					  Authorization:`Bearer ${user.refresh_token}`
				  }
			  });
			  //拿到新的token之后把它更新到容器中、
			  user.token = data.data.token;
			  store.commit('setUser',user);
			  //把失败的请求重新发出去
			  //error.config 是本次请求的相关配置信息对象
			  return request(error.config);
		  }catch(err){
			  //刷新token都失败，直接跳转登录页
			  redirectLogin();
		  }
		  
		  //把失败的请求重新发出去
	  }else if(status === 403){
		 Toast.fail('没有操作权限');
	  }else if(status>=500){
		  Toast.fail('服务端异常');
	  }
	  // 抛出异常
    return Promise.reject(error);
  });
  
  function redirectLogin(){
	  router.replace({
		  name:'login',
		  //传递查询参数，查询参数会以？作为分隔符放到url后面
		  query:{
			  //数据名是自己起的
			  //router.currentRoute 和我们在组件中获取的this.$route 是一个东西
			  redirect:router.currentRoute.fullPath
		  }
	  });
  }
// 导出
export default request;